Soru & Cevap

Graphics 2D kullanımı ...

06.04.2020 - 11:56

Herkese merhaba arkadaşlar, canvas a metin yazdırdım ama metin kalitesi düşük çıktı, graphics 2d ile yapmam gerekiyormuş, araştırdım ama bir türlü uyarlayamadım, aşağıda bulunan koda graphics 2d yi nasıl uyarlayabilirim?

 

private Bitmap Text(){
    Bitmap image = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(image);
    if (drawable != null) {
        drawable.setBounds(realBounds);
        drawable.draw(canvas);
    }

    if (textRect.width() == getWidth()) {
        int dy = getHeight() / 2 - staticLayoutText.getHeight() / 2;
        // center vertical
        canvas.translate(0, dy);
    } else {
        int dx = textRect.left;
        int dy = textRect.top + textRect.height() / 2 - staticLayoutText.getHeight() / 2;
        canvas.translate(dx, dy);
    }

    staticLayoutShadow.draw(canvas);
    staticLayoutOutline.draw(canvas);
    staticLayoutText.draw(canvas);
    return image;
}

@Override
public void draw(@NonNull Canvas canvas) {
    Matrix matrix = getMatrix();
    canvas.save();
    canvas.concat(matrix);
    paint = new Paint();
    paint.setAntiAlias(true);
    if (mode != null)
        paint.setXfermode(new PorterDuffXfermode(mode));
    canvas.drawBitmap(Text(), null, realBounds, paint);
    canvas.restore();
}

 

28 Görüntülenme

2 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

Profile picture for user f.erenyucal
f.erenyucal
17.02.2023 - 10:46

 Merhaba! Kodunuzu inceledim ve metin yazdırmak için Canvas sınıfını kullanıyorsunuz. Ancak metnin kalitesi düşük çıkıyor ve bu sorunu çözmek için Graphics2D sınıfını kullanmanız öneriliyor.

Graphics2D sınıfı, Java 2D grafikleri için gelişmiş bir API sağlar ve Canvas sınıfına benzer şekilde kullanılır. Kodunuzu Graphics2D sınıfını kullanacak şekilde güncellemek için aşağıdaki adımları izleyebilirsiniz:

  1. Bitmap nesnesi oluşturma işleminizi BufferedImage ile değiştirin:
BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
  1. BufferedImage nesnesini Graphics2D nesnesine dönüştürün:
Graphics2D graphics = image.createGraphics();
  1. Canvas nesnesindeki drawText() metotlarını Graphics2D nesnesindeki drawString() metotlarıyla değiştirin.

  2. BufferedImage nesnesini dönüştürmek için ImageIO sınıfını kullanın: 

ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
    ImageIO.write(image, "png", baos);
} catch (IOException e) {
    e.printStackTrace();
}
byte[] bytes = baos.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

     Bu değişiklikleri yaptıktan sonra, Text() metodu aşağıdaki gibi görünmelidir:

private Bitmap Text() {
    BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2D graphics = image.createGraphics();

    if (drawable != null) {
        drawable.setBounds(realBounds);
        drawable.draw(graphics);
    }

    if (textRect.width() == getWidth()) {
        int dy = getHeight() / 2 - staticLayoutText.getHeight() / 2;
        // center vertical
        graphics.translate(0, dy);
    } else {
        int dx = textRect.left;
        int dy = textRect.top + textRect.height() / 2 - staticLayoutText.getHeight() / 2;
        graphics.translate(dx, dy);
    }

    graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    graphics.setFont(new Font("Arial", Font.PLAIN, 16)); // istediğiniz yazı tipi ve boyutunu seçin
    graphics.drawString("metninizi buraya yazın", 0, 0);

    graphics.dispose();

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        ImageIO.write(image, "png", baos);
    } catch (IOException e) {
        e.printStackTrace();
    }
    byte[] bytes = baos.toByteArray();
    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

    return bitmap;
}

 

 
Profile picture for user f.erenyucal
f.erenyucal
17.02.2023 - 10:45

Merhaba! Kodunuzu inceledim ve metin yazdırmak için Canvas sınıfını kullanıyorsunuz. Ancak metnin kalitesi düşük çıkıyor ve bu sorunu çözmek için Graphics2D sınıfını kullanmanız öneriliyor.

Graphics2D sınıfı, Java 2D grafikleri için gelişmiş bir API sağlar ve Canvas sınıfına benzer şekilde kullanılır. Kodunuzu Graphics2D sınıfını kullanacak şekilde güncellemek için aşağıdaki adımları izleyebilirsiniz:

  1. Bitmap nesnesi oluşturma işleminizi BufferedImage ile değiştirin:
BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
  1. BufferedImage nesnesini Graphics2D nesnesine dönüştürün:
Graphics2D graphics = image.createGraphics();
  1. Canvas nesnesindeki drawText() metotlarını Graphics2D nesnesindeki drawString() metotlarıyla değiştirin.

  2. BufferedImage nesnesini dönüştürmek için ImageIO sınıfını kullanın: 

ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
    ImageIO.write(image, "png", baos);
} catch (IOException e) {
    e.printStackTrace();
}
byte[] bytes = baos.toByteArray();
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

     Bu değişiklikleri yaptıktan sonra, Text() metodu aşağıdaki gibi görünmelidir:

private Bitmap Text() {
    BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2D graphics = image.createGraphics();

    if (drawable != null) {
        drawable.setBounds(realBounds);
        drawable.draw(graphics);
    }

    if (textRect.width() == getWidth()) {
        int dy = getHeight() / 2 - staticLayoutText.getHeight() / 2;
        // center vertical
        graphics.translate(0, dy);
    } else {
        int dx = textRect.left;
        int dy = textRect.top + textRect.height() / 2 - staticLayoutText.getHeight() / 2;
        graphics.translate(dx, dy);
    }

    graphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    graphics.setFont(new Font("Arial", Font.PLAIN, 16)); // istediğiniz yazı tipi ve boyutunu seçin
    graphics.drawString("metninizi buraya yazın", 0, 0);

    graphics.dispose();

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        ImageIO.write(image, "png", baos);
    } catch (IOException e) {
        e.printStackTrace();
    }
    byte[] bytes = baos.toByteArray();
    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

    return bitmap;
}